home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / cdity / ModeProSrc.lha / Daemon / OldPatch / Copy_of_MPPatch.cNot < prev    next >
Text File  |  1996-11-23  |  31KB  |  1,281 lines

  1. #include "MP.h"
  2. #include <graphics/videocontrol.h>
  3. #include <graphics/displayinfo.h>
  4. #include <debug.h>
  5.  
  6. ULONG Colors[]={1<<16|0,~0,0,0,0};
  7.  
  8. #define HAM_EHB_DP_KEY (HAM_KEY | 0x400 | EXTRAHALFBRITE_KEY)
  9. //                                DualPF
  10. //BOOL MPSem->Debug=FALSE;
  11.  
  12. #define ADD_DEBUG_CODE
  13.  
  14. /* kprintf
  15.  
  16. #ifdef ADD_DEBUG_CODE
  17.       if(MPSem->Debug)
  18.       {
  19.       }
  20. #endif
  21.  
  22. */
  23.  
  24. #ifdef ADD_DEBUG_CODE
  25. void PrintTags(struct TagItem *tags);
  26. UBYTE *FindTagSting(ULONG id);
  27. void PrintDefNode(struct DefaultNode *DN);
  28. #endif
  29.  
  30. #define AllocOpenNode(on)  (on ? on: AllocMem(sizeof(struct OpenNode),MEMF_CLEAR|MEMF_PUBLIC))
  31.   
  32. void CatchDNode(ULONG Dest, UBYTE *Name, struct DefaultNode *SrcNode);
  33. void CloneTextAttr(struct TTextAttr *Source, struct TTextAttr *Dest);
  34.  
  35. extern ULONG CenterAll;
  36. extern struct MPSem *MPSem;
  37. extern CxObj  *Broker;
  38. extern struct MsgPort *BrokerPort;
  39. extern BOOL   V39;
  40. extern BYTE   PublicSignal;
  41. extern struct Process  *MPTask;
  42. extern struct MsgPort *CatchPort;
  43. extern struct Screen ASM *(*OldOpenScreen)(REG __a0 struct NewScreen *,
  44.                                            REG __a6 struct IntuitionBase *);
  45. extern struct Screen ASM *(*OldOpenScreenTagList)(REG __a0 struct ExtNewScreen *ns,
  46.                                                   REG __a1 struct TagItem *taglist,
  47.                                                   REG __a6 struct IntuitionBase * );
  48. extern BOOL ASM (*OldCloseScreen)   (REG __a0 struct Screen *,REG __a6 struct IntuitionBase *);
  49. extern LONG ASM (*OldCloseWorkBench)(REG __a6 struct IntuitionBase *lib);
  50.  
  51. /*********************************************************************************/
  52.  
  53. struct Screen ASM __saveds  *NewOpenScreen(REG __a0 struct ExtNewScreen *ns,
  54.                                            REG __a6 struct IntuitionBase *IBase)
  55. {
  56.   return(NewOpenScreenTagList(ns,(ns->Type & NS_EXTENDED ?ns->Extension:0),IBase ));
  57. }
  58.  
  59. UBYTE *Topaz="topaz.font";
  60.  
  61. struct PatchData
  62. {
  63.   struct BitMap *bitmap;
  64.   struct Rectangle odclip;
  65.   struct DefaultNode *n;
  66.   struct DimensionInfo diminfo;
  67.   struct DisplayInfo   dispinfo;
  68.  
  69.  
  70.   struct Screen *scr;
  71.  
  72.   struct ScreenModeRequester *sr;
  73.   struct ColorSpec Colors4[257];
  74.   ULONG  Colors32[256*3+2];
  75.  
  76.   WORD  width,
  77.         height,
  78.         depth;
  79.   BOOL  dodepth;
  80.  
  81.   LONG  autoscroll,
  82.         look3d,
  83.         modeid,
  84.         overscan,
  85.         interleave,
  86.         wbscr;
  87.         
  88.   BOOL  changed,modechanged;
  89.   BOOL  promote;
  90.        
  91.   WORD  pens[1],
  92.         *screenpens,
  93.         dripens[DRIPENS+1];   
  94.        
  95.   struct TagItem ti[30],
  96.                  *tag;
  97.  
  98.   struct TextAttr *storedfont;              
  99.   struct TextFont *textfont;              
  100.   struct TagItem fonttags[2];
  101.  
  102.   ULONG  tagnum,ehbham;
  103.  
  104.   UBYTE  cli_name[41],*taskname;
  105.   UBYTE *title;
  106.        
  107.   struct OpenNode *opennode;
  108.  
  109.   LONG custombm;
  110. };
  111.  
  112. struct DefaultNode CenterAllNode={0};
  113.       
  114. struct Screen ASM __saveds  *NewOpenScreenTagList(REG __a0 struct ExtNewScreen *ns,
  115.                                                   REG __a1 struct TagItem *TagList,
  116.                                                   REG __a6 struct IntuitionBase *IBase)
  117. {
  118.   struct BitMap *bitmap;
  119.   struct Rectangle odclip;
  120.   struct DefaultNode *n;
  121.   struct DimensionInfo diminfo;
  122.   struct DisplayInfo   dispinfo;
  123.  
  124.   struct Screen *scr;
  125.  
  126.   struct ScreenModeRequester *sr;
  127.   struct ColorSpec Colors4[257];
  128.   ULONG  Colors32[256*3+2];
  129.  
  130.   WORD  width,
  131.         height,
  132.         depth;
  133.   BOOL  dodepth;
  134.  
  135.   LONG  autoscroll,
  136.         look3d,
  137.         modeid,
  138.         overscan,
  139.         interleave,
  140.         wbscr;
  141.         
  142.   BOOL  changed,modechanged;
  143.   BOOL  promote=TRUE;
  144.        
  145.   WORD  pens[]={~0},
  146.         *screenpens,
  147.         dripens[DRIPENS+1];   
  148.        
  149.   struct TagItem ti[30],
  150.                  *tag;
  151.  
  152.   struct TextAttr *storedfont;              
  153.   struct TextFont *textfont;              
  154.   struct TagItem fonttags[]= { TA_DeviceDPI , (1<<16) | 1 , TAG_DONE,0 };
  155.  
  156.   ULONG  tagnum,ehbham;
  157.  
  158.   UBYTE  cli_name[41],*taskname;
  159.   UBYTE *title;
  160.        
  161.   struct OpenNode *opennode;
  162.  
  163.   LONG custombm;
  164.  
  165. /**** END VARS ****/
  166.  
  167.   ObtainSemaphoreShared(&MPSem->ListSem); 
  168.   ObtainSemaphore(&MPSem->NodeSem); 
  169.   
  170.   pens[0]=(~0);
  171.   
  172. #ifdef ADD_DEBUG_CODE
  173.   if(MPSem->Debug)
  174.   {
  175.     kprintf("sizeof(struct PatchData) %8lx\n",sizeof(struct PatchData));
  176.     
  177.     kprintf("\n--------------%s------------------\nOpenScreenX()\n",FindTask(0)->tc_Node.ln_Name);
  178.     kprintf("  IntuitionBase: %8lx\n",IBase);
  179.     if(ns)
  180.     {
  181.       kprintf("  NewScreen: %8lx\n",ns);
  182.       kprintf("    LeftEdge=%ld TopEdge=%ld\n    Width=%ld Height=%ld\n    Depth=%ld\n    dpen=%ld bpen=%ld\n    vm=%8lx type=%ld\n    font=%8lx\n",
  183.         ns->LeftEdge, ns->TopEdge, ns->Width, ns->Height, ns->Depth,
  184.         ns->DetailPen, ns->BlockPen, ns->ViewModes, ns->Type, ns->Font);
  185.       if(ns->DefaultTitle)
  186.         kprintf("    defaulttitle=%s\n", ns->DefaultTitle);
  187.       kprintf("    gadgets=%8lx  bitmap=%8lx\n",
  188.         ns->Gadgets, ns->CustomBitMap);
  189.       if(ns->Type & NS_EXTENDED)
  190.         kprintf("    * is NS_EXTENDED\n");
  191.     }  
  192.     if(TagList)
  193.       PrintTags(TagList);
  194.   }
  195. #endif
  196.   
  197.   /* Now that we've got the semaphore all globals are mine */
  198.   /* initialize everything */
  199.  
  200.   tagnum=0;
  201.  
  202.   title=NULL;
  203.  
  204.   opennode=NULL;   //likewb=0;
  205.   
  206.   custombm=changed=modechanged=look3d=overscan=interleave=0L;
  207.   depth=1;
  208.   dodepth=FALSE;
  209.   
  210.   wbscr=0;  
  211.   
  212.   width=height=autoscroll=modeid=-1;
  213.  
  214.   screenpens=pens;
  215.   
  216.   taskname=FindTask(0)->tc_Node.ln_Name;
  217.  
  218.   if(GetProgramName(cli_name,40)) /* Get cli program's name */
  219.     if(cli_name[0]!=0)            /* make sure cli_name contains something */
  220.       taskname=cli_name;
  221.   
  222.   /* Initialization Done */
  223.  
  224.   /**** Extract screen info from ns and TagList ****/  
  225.   if(ns)                     
  226.   {
  227.     storedfont=ns->Font;
  228.     width    =ns->Width;
  229.     height   =ns->Height;
  230.     modeid   =ns->ViewModes;
  231.     depth    =ns->Depth;
  232.     title    =ns->DefaultTitle;
  233.     custombm =ns->Type & CUSTOMBITMAP;
  234.     wbscr    =(ns->Type & SCREENTYPE)==WBENCHSCREEN;
  235.   }
  236.  
  237.   if(TagList)
  238.   {
  239.     custombm  =GetTagData(SA_BitMap,    custombm,TagList);
  240.     width     =GetTagData(SA_Width,     width,   TagList);
  241.     height    =GetTagData(SA_Height,    height,  TagList);
  242.     autoscroll=GetTagData(SA_AutoScroll,autoscroll,TagList);
  243.     overscan  =GetTagData(SA_Overscan,  overscan,TagList);
  244.     modeid    =GetTagData(SA_DisplayID, modeid,  TagList);
  245.     depth     =GetTagData(SA_Depth,     depth,   TagList);
  246.     title     =(UBYTE *)GetTagData(SA_Title,(ULONG)title,TagList);
  247.     wbscr     =(GetTagData(SA_Type,wbscr,TagList) & SCREENTYPE)==WBENCHSCREEN;
  248.     interleave=GetTagData(SA_Interleaved,interleave,TagList);
  249.     if(tag=FindTagItem(SA_Overscan,TagList))
  250.       if(!FindTagItem(SA_DClip,TagList))
  251.         overscan=tag->ti_Data;
  252.     if(tag=FindTagItem(SA_Pens,TagList))
  253.     {
  254.       screenpens=(UWORD *)(tag->ti_Data);
  255.       //look3d=TRUE;
  256.     }
  257.   }
  258.  
  259. #ifdef ADD_DEBUG_CODE
  260.   if(MPSem->Debug)
  261.   {
  262.     kprintf("..................................\n");
  263.     kprintf("w=%ld h=%ld d=%ld custombm=%8lx\n",width,height,depth,custombm);
  264.     kprintf("..................................\n");
  265.   }
  266. #endif
  267.  
  268.   n=NULL;
  269.  
  270.   ehbham=0;
  271.  
  272.   if(GetDisplayInfoData(0,(UBYTE *)&dispinfo,sizeof(dispinfo),DTAG_DISP,modeid))
  273.     ehbham=dispinfo.PropertyFlags & (DIPF_IS_DUALPF | DIPF_IS_HAM | 
  274.                                      DIPF_IS_PF2PRI | DIPF_IS_EXTRAHALFBRITE);
  275.   
  276. #ifdef ADD_DEBUG_CODE
  277.   if(MPSem->Debug)
  278.   {
  279.     kprintf("wbscr=%lx\n",wbscr);
  280.   }
  281. #endif
  282.   
  283.   if(!title) title=GetString(MSG_ITEM_NO_NAME); /* Just in case ther isn't a title */
  284.  
  285.   if(!(n=FindDNode(&MPSem->PromotionList[1],title)))
  286.     if(!(n=FindDNode(&MPSem->PromotionList[0],taskname)))
  287.     { 
  288.       struct DefaultNode *smnode;
  289.       BOOL   smgo=TRUE;
  290.       ULONG  /*modenorm,*/ mode_monall,orig_monall;
  291.       
  292.       //modenorm    =modeid;// & ~HAM_EHB_DP_KEY;
  293.       mode_monall  =modeid | ALL_MODES;
  294.       
  295.       smnode=(struct DefaultNode *)MPSem->PromotionList[PL_SCREENMODES].lh_Head;
  296.       while(smnode->Def_Node.ln_Succ && smgo)
  297.       {
  298.         orig_monall =smnode->OrigDisplayID & ALL_MODES;
  299.       
  300.         if( (smnode->OrigDisplayID == modeid) ||
  301.             (smnode->OrigDisplayID == mode_monall) )     
  302.         {
  303.           n=smnode;
  304.           smgo=FALSE;
  305.         }
  306.         smnode=(struct DefaultNode *)smnode->Def_Node.ln_Succ;
  307.       }
  308.       /*
  309.       if(MPSem->CatchPrograms && taskname)   //Catch new names only.
  310.         CatchDNode(0,taskname);
  311.       if(MPSem->CatchScreens) 
  312.         CatchDNode(1,title);
  313.       */
  314.     }
  315.  
  316. #ifdef ADD_DEBUG_CODE
  317.   if(MPSem->Debug)
  318.   {
  319.     if(n)
  320.       PrintDefNode(n);
  321.   }
  322.   
  323. #endif
  324.  
  325.   if(!n && MPSem->CenterAll)
  326.   {
  327.     n=&CenterAll;
  328.     CenterAll.CenterFlags=MPSem->CenterAll;
  329.   } 
  330.  
  331.   if(!MPSem->Enabled || !n )
  332.   {
  333.     scr=OldOpenScreenTagList(ns,TagList,IBase);
  334.     ReleaseSemaphore(&MPSem->ListSem);
  335.     ReleaseSemaphore(&MPSem->NodeSem);
  336.     return(scr);
  337.   }
  338.   
  339.  
  340.   if(!wbscr)
  341.   {
  342.     switch(n->ModeSelect)
  343.     {
  344.       case 0:
  345.         break;
  346.       case 1:
  347. #ifdef ADD_DEBUG_CODE
  348.       if(MPSem->Debug)
  349.       {
  350.         kprintf("Promoting Monitor\n");
  351.       }
  352. #endif  
  353.         if(modeid > -1)
  354.         {
  355.           if(V39)
  356.           {
  357.             modeid=BestModeID(BIDTAG_SourceID       ,modeid,
  358.                               BIDTAG_MonitorID      ,n->ModeID & MONITOR_ID_MASK,
  359.                               BIDTAG_Depth          ,depth,
  360.                               BIDTAG_DIPFMustHave   ,ehbham,
  361.                               TAG_SKIP              ,(width==-1 ? 1:0),
  362.                               BIDTAG_DesiredWidth   ,width,
  363.                               TAG_SKIP              ,(height==-1 ? 1:0),
  364.                               BIDTAG_DesiredHeight  ,height,
  365.                               TAG_DONE);
  366.             //kprintf("%8lx\n",modeid);
  367.           }
  368.           else
  369.           {
  370.             modeid= (n->ModeID & MONITOR_ID_MASK) | (modeid & (~MONITOR_ID_MASK));
  371.           }
  372.           if(modeid==INVALID_ID) 
  373.              modeid=n->ModeID;
  374.               
  375.           modechanged=TRUE;
  376.         }
  377.         break;
  378.       case 2:
  379. #ifdef ADD_DEBUG_CODE
  380.       if(MPSem->Debug)
  381.       {
  382.         kprintf("Promoting ScreenMode\n");
  383.       }
  384. #endif  
  385.         modeid      =n->ModeID/* | ehbham*/;
  386.         overscan    =n->OverscanType;
  387.         width       =n->Width;
  388.         height      =n->Height;
  389.     
  390.         if(n->Flags & DEPTH)
  391.         {
  392.           depth=n->Depth;
  393.           dodepth=TRUE;
  394.         }
  395.         changed=TRUE;
  396.         break;
  397.       case 3:
  398. #ifdef ADD_DEBUG_CODE
  399.       if(MPSem->Debug)
  400.       {
  401.         kprintf("Promoting with Requester\n");
  402.       }
  403. #endif  
  404.         if((sr=(struct ScreenModeRequester *)AllocAslRequestTags(ASL_ScreenModeRequest,
  405.                     ASLSM_TitleText             ,title,
  406.                     ASLSM_DoWidth               ,TRUE ,
  407.                     ASLSM_DoHeight              ,TRUE ,
  408.                     ASLSM_DoOverscanType        ,TRUE ,
  409.                     ASLSM_DoAutoScroll          ,TRUE ,
  410.                     ASLSM_DoDepth               ,n->Flags & DEPTH,
  411.                     ASLSM_InitialAutoScroll     ,n->AutoScroll,
  412.                     ASLSM_InitialDisplayWidth   ,n->Width,
  413.                     ASLSM_InitialDisplayHeight  ,n->Height,
  414.                     ASLSM_InitialDisplayID      ,n->ModeID,
  415.                     ASLSM_InitialDisplayDepth   ,n->Depth,
  416.                     ASLSM_NegativeText          ,GetString(MSG_REQ_USE_DEFAULT),
  417.                     ASLSM_PropertyFlags         ,0,
  418.                     ASLSM_PropertyMask          ,BADMODES,                      
  419.                     TAG_END 
  420.                     )))
  421.         {
  422.           if(AslRequest(sr,NULL))
  423.           {
  424.             modeid    =sr->sm_DisplayID | ehbham;
  425.             overscan  =sr->sm_OverscanType;
  426.             width     =sr->sm_DisplayWidth;
  427.             height    =sr->sm_DisplayHeight;    
  428.             changed   =TRUE;
  429.             if(n->Flags & DEPTH)
  430.             {
  431.               depth=sr->sm_DisplayDepth;
  432.               dodepth=TRUE;
  433.             }
  434.           }
  435.           else
  436.           {
  437.             promote=FALSE;
  438.           }
  439.           FreeAslRequest(sr);  
  440.         }
  441.         break; 
  442.     }/* end switch*/
  443.     
  444. #ifdef ADD_DEBUG_CODE
  445.     kprintf("end switch\n");
  446.     Delay(50*1);
  447. #endif  
  448.  
  449.     /**** Setup promoted taglist ****/
  450.     if(promote)
  451.     {
  452.       look3d     =n->Look3D;
  453.       interleave =(n->Flags & INTERLEAVE) | interleave;
  454.       screenpens =n->Pens;
  455.       autoscroll  =n->AutoScroll;
  456.        
  457.       if( (n->Flags & DNF_FORCEPLANAR)  && 
  458.           (width>0)                     && 
  459.           (height>0)                    &&
  460.           (!custombm)                   &&
  461.           (V39)                         &&
  462.           (depth>0)  )
  463.       {
  464.   
  465.         if(bitmap=AllocBitMap(width,height,depth,BMF_CLEAR|BMF_DISPLAYABLE,0))
  466.         {
  467.   
  468.           if(opennode=AllocOpenNode(opennode))
  469.           {
  470.             opennode->Flags|=ON_BITMAP;
  471.           
  472.             opennode->BitMap=bitmap;
  473.             ti[tagnum].ti_Tag=SA_BitMap;
  474.             ti[tagnum].ti_Data=(ULONG)bitmap;
  475.             tagnum++;
  476.           }
  477.           else
  478.             FreeBitMap(bitmap);
  479.         }
  480.       }
  481.       
  482.     
  483.       if(changed && !(custombm))
  484.       {
  485.         if(width!=0)
  486.         {
  487.           ti[tagnum].ti_Tag=SA_Width;
  488.           ti[tagnum].ti_Data=width;
  489.           tagnum++;
  490.         }
  491.         if(height!=0)
  492.         {
  493.           ti[tagnum].ti_Tag=SA_Height;
  494.           ti[tagnum].ti_Data=height;
  495.           tagnum++;
  496.         }
  497.         
  498.         if(FindTagItem(SA_DClip,TagList))
  499.         { // if it specifies a dclip, i need to override it.
  500.           if(QueryOverscan(modeid,&odclip,overscan))
  501.           {
  502.             ti[tagnum].ti_Tag=SA_DClip;
  503.             ti[tagnum].ti_Data=(ULONG)&odclip;
  504.             tagnum++;
  505.           }
  506.         }
  507.         else
  508.         {
  509.           ti[tagnum].ti_Tag=SA_Overscan;
  510.           ti[tagnum].ti_Data=overscan;
  511.           tagnum++;
  512.         }
  513.       }
  514.     
  515.       if(modechanged || changed)
  516.       {
  517.         ti[tagnum].ti_Tag=SA_DisplayID;
  518.         ti[tagnum].ti_Data=modeid;
  519.         tagnum++;
  520.       }
  521.   
  522.       if(n->Flags & SHAREPENS)
  523.       {
  524.         ti[tagnum].ti_Tag=SA_SharePens;
  525.         ti[tagnum].ti_Data=TRUE;
  526.         tagnum++;
  527.       }
  528.   
  529.       if(dodepth && !(custombm) && !(ehbham))
  530.       {
  531.         ti[tagnum].ti_Tag=SA_Depth;
  532.         ti[tagnum].ti_Data=depth;
  533.         tagnum++;
  534.   
  535.       }
  536.   
  537.       
  538.       if((n->Flags&DNF_PALETTE) && n->Palette && n->Colors)
  539.       {
  540.         if(V39)
  541.         {    
  542.           Colors32[0]=n->Colors<<16;
  543.           CopyMemQuick(n->Palette,&Colors32[1],n->Colors*3*sizeof(ULONG));
  544.           Colors32[n->Colors*3+2]=0;
  545.           
  546.           ti[tagnum].ti_Tag=SA_Colors32;
  547.           ti[tagnum].ti_Data=(ULONG)Colors32;
  548.           tagnum++;
  549.         }
  550.         else
  551.         {
  552.           ULONG c;
  553.     
  554.           for(c=0;c<n->Colors;c++)
  555.           {
  556.             Colors4[c].ColorIndex=c;
  557.             Colors4[c].Red   =n->Palette[c].Red>>28;
  558.             Colors4[c].Green =n->Palette[c].Green>>28;
  559.             Colors4[c].Blue  =n->Palette[c].Blue>>28;
  560.           }
  561.           Colors4[c].ColorIndex=-1;
  562.           
  563.           ti[tagnum].ti_Tag=SA_Colors; 
  564.           ti[tagnum].ti_Data=(ULONG)Colors4;
  565.           tagnum++;
  566.         }
  567.       }
  568.   
  569.       switch(n->FontType)
  570.       {
  571.         case SFONT_SYS:
  572.           if(ns) ns->Font=0;
  573.           ti[tagnum].ti_Tag=SA_SysFont;
  574.           ti[tagnum].ti_Data=1;
  575.           tagnum++;
  576.           break;
  577.         case SFONT_MP:
  578.           if(n->Font.tta_Name)
  579.           {
  580.             if(opennode=AllocOpenNode(opennode))
  581.             {
  582.               opennode->Flags|=ON_FONT;
  583.             
  584.               ti[tagnum].ti_Tag  =SA_Font;
  585.               ti[tagnum].ti_Data =(ULONG)&opennode->TA;
  586.               tagnum++;
  587.     
  588.               if(n->Flags & FIXASPECT && modeid != -1)
  589.               {
  590.                 if(GetDisplayInfoData(NULL,(UBYTE *)&dispinfo,sizeof(struct DisplayInfo),DTAG_DISP,modeid))
  591.                 {
  592.                   fonttags[0].ti_Data=(ULONG)dispinfo.Resolution.x|(((ULONG)dispinfo.Resolution.y)<<16);
  593.                   n->Font.tta_Style |= FSF_TAGGED;
  594.                   n->Font.tta_Tags   =fonttags;
  595.                 }
  596.               }
  597.               CloneTextAttr(&n->Font,&opennode->TA);
  598.     
  599.               n->Font.tta_Style &= (~FSF_TAGGED);
  600.               n->Font.tta_Tags=NULL;
  601.             }
  602.           }
  603.           break;
  604.       }
  605.   
  606.       if(n->PubOptions==1)
  607.       {
  608.         ULONG error=FALSE;
  609.         struct TagItem badtags[]=
  610.         {
  611.           SA_BitMap,    1<<0,
  612. //      SA_PubName,   1<<1,
  613.           SA_PubSig,    1<<2,
  614.           SA_PubTask,   1<<3,
  615.           SA_BackFill,  1<<4,
  616.           TAG_DONE,     0
  617.         };
  618.         
  619.         if(TagList) error =PackBoolTags(0,TagList,badtags);
  620.         if(ns)      error|=(ns->Type & CUSTOMBITMAP);
  621.         
  622.         if(error==0)
  623.         {
  624.           if(opennode=AllocOpenNode(opennode))
  625.           {
  626.             struct OpenNode *won;
  627.             UBYTE number[8];
  628.             ULONG cnt=1,len;
  629.             
  630.             strncpy(opennode->PubName,n->PubName,MAXPUBSCREENNAME);
  631.             opennode->PubName[MAXPUBSCREENNAME]=0;
  632.             len=strlen(opennode->PubName);
  633.             len=min(len,MAXPUBSCREENNAME-9);
  634.             
  635.             won=(struct OpenNode *)MPSem->OpenList.lh_Head;
  636.             while(won->on_Node.ln_Succ)
  637.             {
  638.               if(cnt > 1)   
  639.               {
  640.                 number[0]='.';
  641.                 stci_d(&number[1],cnt);        
  642.                 opennode->PubName[len]=0;
  643.                 strncat(opennode->PubName,number,MAXPUBSCREENNAME);
  644.                 opennode->PubName[MAXPUBSCREENNAME]=0;
  645.               }
  646.               
  647.               if(0==strcmp(opennode->PubName,won->PubName))
  648.               {
  649.                 won=(struct OpenNode *)MPSem->OpenList.lh_Head;
  650.                 cnt++;
  651.               }
  652.               else
  653.                 won=(struct OpenNode *)won->on_Node.ln_Succ;
  654.             }
  655.             
  656.             opennode->PubName[MAXPUBSCREENNAME]=0;
  657.             opennode->Flags|= ON_PUBLIC | ON_OPEN;
  658.             
  659.             ti[tagnum].ti_Tag=SA_Title;
  660.             ti[tagnum].ti_Data=(ULONG)opennode->PubName;
  661.             tagnum++;
  662.     
  663.             ti[tagnum].ti_Tag=SA_PubName;
  664.             ti[tagnum].ti_Data=(ULONG)opennode->PubName;
  665.             tagnum++;
  666.         
  667.             ti[tagnum].ti_Tag=SA_PubSig;
  668.             ti[tagnum].ti_Data=PublicSignal;
  669.             tagnum++;
  670.             
  671.             ti[tagnum].ti_Tag=SA_PubTask;
  672.             ti[tagnum].ti_Data=(ULONG)MPTask;
  673.             tagnum++;
  674.             
  675.             
  676.             if(!(opennode->Flags & ON_FONT))
  677.             {
  678.               struct TTextAttr *ot=NULL;
  679.               
  680.               if(ns)  ot=(struct TTextAttr *)ns->Font;          
  681.               ot=(struct TTextAttr *)GetTagData(SA_Font,(ULONG)ot,TagList);
  682.               
  683.               if(ot)
  684.               {
  685.                 opennode->Flags|=ON_FONT;
  686.     
  687.                 CloneTextAttr(ot,&opennode->TA);
  688.     
  689.                 ti[tagnum].ti_Tag =SA_Font;
  690.                 ti[tagnum].ti_Data=(ULONG)&opennode->TA;
  691.                 tagnum++;
  692.               }
  693.             }
  694.           }
  695.         }
  696.       }
  697.     } /* end - if(promote) */
  698.   }/* end - if(!wbscr) */
  699.   else  
  700.   { /* Yes, this is the Workbench screen */
  701.     if(opennode=AllocOpenNode(opennode))
  702.       opennode->Flags|=ON_WORKBENCH;
  703.   }
  704.  
  705.   if(promote)
  706.   {
  707.     if(look3d)
  708.     {
  709.       LONG dp;
  710.       
  711.       for(dp=0;dp<DRIPENS;dp++)
  712.         dripens[dp]=n->Pens[dp];
  713.       dripens[dp]=~0;
  714.       
  715.       ti[tagnum].ti_Tag=SA_Pens;
  716.       ti[tagnum].ti_Data=(ULONG)dripens;
  717.       tagnum++;
  718.       /*
  719.       if(depth==1)
  720.       {
  721.         depth=2;  // This nolonger works
  722.         dodepth=TRUE;
  723.         //  ti[tagnum].ti_Tag=SA_Depth;
  724.         //  ti[tagnum].ti_Data=2;
  725.         //   tagnum++;
  726.       }*/
  727.     }
  728.   
  729.     if(autoscroll)
  730.     {
  731.       ti[tagnum].ti_Tag=SA_AutoScroll;
  732.       ti[tagnum].ti_Data=TRUE;
  733.       tagnum++;
  734.     }
  735.   
  736.     
  737.     if(n->CenterFlags)
  738.     {    
  739.       if(GetDisplayInfoData(NULL,(UBYTE *)&diminfo,sizeof(struct DimensionInfo),DTAG_DIMS,modeid))
  740.       {
  741.         if(n->CenterFlags & 1)
  742.         {
  743.           if(width>-1)
  744.           {
  745.             ti[tagnum].ti_Tag=SA_Left;
  746.             ti[tagnum].ti_Data=((diminfo.StdOScan.MaxX-diminfo.StdOScan.MinX)-width)/2;
  747.             tagnum++;
  748.           }
  749.         }
  750.         if(n->CenterFlags & 2)
  751.         {
  752.           if(height>-1)
  753.           {
  754.             ti[tagnum].ti_Tag=SA_Top;
  755.             ti[tagnum].ti_Data=((diminfo.StdOScan.MaxY-diminfo.StdOScan.MinY)-height)/2;
  756.             tagnum++;
  757.           }
  758.         }
  759.       }
  760.     }
  761.   
  762.     if(n->Flags & SCRHOTKEY)
  763.     {
  764.       if(opennode=AllocOpenNode(opennode))
  765.       {
  766.         if(opennode->HotKey=AllocVec(strlen(n->HotKey)+1,MEMF_CLEAR|MEMF_PUBLIC))
  767.         {
  768.           strcpy(opennode->HotKey,n->HotKey);
  769.           opennode->Cx=AddHotKey(Broker,BrokerPort,opennode->HotKey,(ULONG)opennode);
  770.         }
  771.       }
  772.     }
  773.     
  774.   
  775.     if(interleave && !(custombm))
  776.     {
  777.       ti[tagnum].ti_Tag=SA_Interleaved;
  778.       ti[tagnum].ti_Data=TRUE;
  779.       tagnum++;
  780.     }
  781.   
  782.   
  783.       
  784. /*
  785.     ti[tagnum].ti_Tag=SA_VideoControl; /*** just a little extra for v40 ***/
  786.     ti[tagnum].ti_Data=VCTags;
  787.     tagnum++;
  788.   */
  789.     
  790.     ti[tagnum].ti_Tag=SA_MinimizeISG; /*** just a little extra for v40 ***/
  791.     ti[tagnum].ti_Data=TRUE;
  792.     tagnum++;
  793.   
  794.     if(TagList)
  795.     {
  796.       ti[tagnum].ti_Tag=TAG_MORE;
  797.       ti[tagnum].ti_Data=(ULONG)TagList;
  798.     }
  799.     else
  800.     {
  801.       ti[tagnum].ti_Tag=TAG_DONE;
  802.       ti[tagnum].ti_Data=0;
  803.     }
  804.     /**** End Setup TagList ****/
  805.     
  806.     if(opennode)
  807.     {
  808.       if(opennode->Flags & ON_FONT)
  809.         textfont=OpenDiskFont((struct TextAttr *)&opennode->TA);
  810.     }
  811.   } /* end - if(promote) */
  812.  
  813.  
  814. #ifdef ADD_DEBUG_CODE  
  815.   if(MPSem->Debug)
  816.   {
  817.     kprintf("  %ld new tags\n",tagnum);
  818.     kprintf("  New TagList\n");
  819.     PrintTags(ti);
  820.     Delay(50*5);
  821.     kprintf("  Opening\n");
  822.   }
  823. #endif
  824.  
  825.   scr=OldOpenScreenTagList(ns,ti,IBase);
  826.  
  827. #ifdef ADD_DEBUG_CODE  
  828.   if(MPSem->Debug)
  829.   {
  830.     kprintf("  Screen Addr %8lx\n",scr);
  831.     Delay(50*5);
  832.   }
  833. #endif
  834.  
  835.   if(scr && n->Flags & SHAREPENS && n->LockedPens && V39)
  836.   {
  837.     UBYTE *str,state=0,done=FALSE;
  838.     WORD num=0,num1=0,num2;
  839.     struct ColorMap *cm;
  840.     
  841.     cm=scr->ViewPort.ColorMap;
  842.     
  843.     str=n->LockedPens;
  844.     
  845.     while(!done)
  846.     {
  847.       if(!*str) done=TRUE;
  848.       
  849.       if(*str>='0' && *str<='9')
  850.       {
  851.         if(state==0)
  852.           state=1;
  853.         num=0;
  854.         while(*str>='0' && *str<='9')
  855.         {
  856.           num*=10;
  857.           num+=*str - '0';
  858.           str++;
  859.         }
  860.         
  861.         switch(state)
  862.         {
  863.           case 1:
  864. #ifdef ADD_DEBUG_CODE  
  865.             kprintf("  obtaining pen %d\n",num);
  866. #endif
  867.             ObtainPen(cm,num,0,0,0, PEN_EXCLUSIVE | PEN_NO_SETCOLOR);
  868.             break;
  869.           case 2:
  870.             for(num2=num1+1;num2<=num;num2++)
  871.             {
  872. #ifdef ADD_DEBUG_CODE  
  873.               kprintf("  obtaining pen %d\n",num2);
  874. #endif
  875.               ObtainPen(cm,num2,0,0,0, PEN_EXCLUSIVE | PEN_NO_SETCOLOR);
  876.             }
  877.             break;
  878.         }
  879.         state=0;
  880.        
  881.       }
  882.       
  883.       if(*str==' ')
  884.         for(;*str==' ';str++);
  885.       else
  886.         if(*str=='-')
  887.         {
  888.           num1=num;
  889.           state=2;
  890.           str++;
  891.         }
  892.         else
  893.           str++;
  894.     }
  895.   }
  896.  
  897.  
  898.  
  899.   if(opennode)
  900.   {
  901.     if(opennode->Flags & ON_FONT)
  902.       if(textfont)
  903.         CloseFont(textfont);
  904.     
  905.     if(scr)
  906.     {
  907.       opennode->Screen=scr;
  908.       if(opennode->Flags & ON_PUBLIC)
  909.       {
  910.         if(n->PubOptions == 1)
  911.         {
  912.           PubScreenStatus(scr,0);
  913.         }
  914.       }
  915.       AddHead(&MPSem->OpenList,(struct Node *)opennode);
  916.     }
  917.     else
  918.       FreeOpenNode(opennode);
  919.   }
  920.   
  921. /*
  922.   if(scr)
  923.   {
  924.     VideoControlTags(scr->ViewPort.ColorMap,
  925.                       VTAG_BORDERSPRITE_SET,TRUE,
  926.                       TAG_DONE);
  927.   }
  928. */
  929.   if(ns) ns->Font=storedfont;
  930.  
  931.  
  932.   if(!scr) scr=OldOpenScreenTagList((struct ExtNewScreen *)ns,TagList,IBase);
  933.  
  934.   ReleaseSemaphore(&MPSem->ListSem);
  935.   ReleaseSemaphore(&MPSem->NodeSem);
  936.  
  937.   return(scr);
  938. }
  939.  
  940. BOOL __saveds ASM NewCloseScreen(REG __a0 struct Screen *S,
  941.                                  REG __a6 struct IntuitionBase *IBase)
  942. {
  943.   struct OpenNode *on;
  944.   BOOL rv,ok=FALSE;
  945.   ULONG pub=0;
  946.  
  947. #ifdef ADD_DEBUG_CODE  
  948.   if(MPSem->Debug)
  949.   {
  950.     kprintf("--------------------------------\nCloseScreen(%8lx) -- %s\n",S,FindTask(0)->tc_Node.ln_Name);
  951.   }
  952. #endif
  953.  
  954.  
  955.   ObtainSemaphore(&MPSem->OpenListSem);
  956.   
  957.   on=(struct OpenNode *)MPSem->OpenList.lh_Head;
  958.   while(on->on_Node.ln_Succ)
  959.   {
  960.     if(on->Screen==S)
  961.     {
  962.       Remove((struct Node *)on);
  963.       pub=on->Flags & ON_PUBLIC;
  964.       ok=TRUE;
  965.       break;
  966.     }
  967.     on=(struct OpenNode *)on->on_Node.ln_Succ;
  968.   }
  969.   
  970.   if(!ok) on=NULL;
  971.   
  972.   if(!pub)
  973.   {
  974.     if(rv=OldCloseScreen(S,IBase))
  975.       FreeOpenNode(on);
  976.     else
  977.       if(on)
  978.         AddHead(&MPSem->OpenList,(struct Node *)on);  
  979.   }
  980.   else  // Public
  981.   {
  982.     on->Flags&=(~ON_OPEN);
  983.     S->DefaultTitle=S->Title=on->PubName;
  984.     ShowTitle(S,TRUE);
  985.     AddHead(&MPSem->OpenList,(struct Node *)on);
  986.     rv=TRUE;
  987.     Signal((struct Task *)MPTask,1<<PublicSignal);
  988.   }          
  989.   ReleaseSemaphore(&MPSem->OpenListSem);   
  990.  
  991. #ifdef ADD_DEBUG_CODE  
  992.   if(MPSem->Debug)
  993.   {
  994.     kprintf("  RV=%d\n",rv);
  995.   }
  996. #endif
  997.   return(rv);
  998. }
  999.  
  1000. /*
  1001. struct Screen *New LockPubScreen(REG STRPTR Name)
  1002. {
  1003.   struct Screen *scr;
  1004.   
  1005.   if(scr=LockPubScreen(Name))
  1006.     return(scr);
  1007.     
  1008.   if(!(n=FindDNode(&MPSem->PromotionList[1],title)))
  1009. */
  1010.  
  1011. LONG __saveds ASM NewCloseWorkBench(REG __a6 struct IntuitionBase *IBase)
  1012. {   
  1013.   LONG retval;
  1014.   
  1015. #ifdef ADD_DEBUG_CODE  
  1016.   if(MPSem->Debug)
  1017.   {
  1018.     kprintf("--------------------------------\nCloseWorkBench() -- %s\n",FindTask(0)->tc_Node.ln_Name);
  1019.   }
  1020. #endif
  1021.  
  1022. //  ObtainSemaphore(&MPSem->OpenListSem);
  1023.   
  1024.   if(retval=OldCloseWorkBench(IBase))
  1025.     FreeWBOpenNode();
  1026.   
  1027. //  ReleaseSemaphore(&MPSem->OpenListSem);
  1028.  
  1029. #ifdef ADD_DEBUG_CODE  
  1030.   if(MPSem->Debug)
  1031.   {
  1032.     kprintf("  RV=%d\n",retval);
  1033.   }
  1034. #endif
  1035.   return(retval);
  1036. }
  1037.   
  1038. void FreeOpenNode(struct OpenNode *on)
  1039. {
  1040. #ifdef ADD_DEBUG_CODE  
  1041.   if(MPSem->Debug)
  1042.   {
  1043.     kprintf("--------------------------------\nFreeOpenNode(%8lx)\n",on);
  1044.   }
  1045. #endif
  1046.   if(on) 
  1047.   { 
  1048.     /* All these are safe to call with NULL */
  1049.     FreeVec(on->TA.tta_Name);
  1050.     FreeVec(on->TA.tta_Tags);
  1051.     DeleteCxObjAll(on->Cx);
  1052.     FreeVec(on->HotKey);
  1053.     if(V39)
  1054.       FreeBitMap(on->BitMap);
  1055.     FreeMem(on,sizeof(struct OpenNode));
  1056.  
  1057. #ifdef ADD_DEBUG_CODE  
  1058.     if(MPSem->Debug)
  1059.     {
  1060.       kprintf("  Freed\n");
  1061.     }
  1062. #endif
  1063.   }
  1064. }
  1065.  
  1066. void FreeWBOpenNode(void)
  1067. {
  1068.   struct OpenNode *on;
  1069.  
  1070. #ifdef ADD_DEBUG_CODE  
  1071.   if(MPSem->Debug)
  1072.   {
  1073.     kprintf("--------------------------------\nFreeWBOpenNode()\n");
  1074.   }
  1075. #endif
  1076.  
  1077.   on=(struct OpenNode *)MPSem->OpenList.lh_Head;
  1078.   while(on->on_Node.ln_Succ)
  1079.   {
  1080.     if((on->Flags & ON_WORKBENCH))
  1081.     {
  1082.       Remove((struct Node *)on);
  1083.       FreeOpenNode(on);
  1084.       return;
  1085.     }
  1086.     on=(struct OpenNode *)on->on_Node.ln_Succ;
  1087.   }
  1088. #ifdef ADD_DEBUG_CODE  
  1089.   if(MPSem->Debug)
  1090.   {
  1091.     kprintf("  Not Freed\n");
  1092.   }
  1093. #endif
  1094. }
  1095.  
  1096.  
  1097. void CatchDNode(ULONG Dest, UBYTE *Name, struct DefaultNode *SrcNode)
  1098. {
  1099.   struct DefaultNode *dnode;
  1100.   LONG l;
  1101.   
  1102.   if(dnode=AllocDefaultNode(Name))
  1103.   {
  1104.     dnode->Type         =Dest;
  1105.     dnode->Width        =SrcNode->Width;
  1106.     dnode->Height       =SrcNode->Height;
  1107.     dnode->AutoScroll   =SrcNode->AutoScroll;
  1108.     dnode->ModeSelect   =0;
  1109.     dnode->ModeID       =SrcNode->ModeID;
  1110.     dnode->OverscanType =SrcNode->OverscanType;
  1111.     dnode->Look3D       =SrcNode->Look3D;
  1112.     dnode->Flags        =SrcNode->Flags;
  1113.     dnode->Depth        =SrcNode->Depth;
  1114. /******* change to <= */
  1115.     for(l=0;l<DRIPENS;l++)
  1116.       dnode->Pens[l]      =SrcNode->Pens[l];
  1117.     
  1118.     PutMsg(CatchPort,(struct Message *)dnode);
  1119.   }
  1120.   return;
  1121. }
  1122.  
  1123.  
  1124.  
  1125.  
  1126. #ifdef ADD_DEBUG_CODE
  1127. #include <tagitemmacros.h>
  1128. void PrintTags(struct TagItem *tags)
  1129. {
  1130.   struct TagItem *tag,*tstate;
  1131.   
  1132.  
  1133.   ProcessTagList(tags,tag,tstate)
  1134.   {
  1135.     kprintf(FindTagSting(tag->ti_Tag),tag->ti_Data);
  1136.     kprintf("\n");
  1137.   }
  1138. }
  1139.  
  1140.  
  1141. ULONG TagID[]=
  1142. {
  1143.   SA_Left,
  1144.   SA_Top,
  1145.   SA_Width,
  1146.   SA_Height,
  1147.   SA_Depth,
  1148.   SA_DetailPen,
  1149.   SA_BlockPen,
  1150.   SA_Title,
  1151.   SA_Colors,
  1152.   SA_ErrorCode,
  1153.   SA_Font,
  1154.   SA_SysFont,
  1155.   SA_Type,
  1156.   SA_BitMap,
  1157.   SA_PubName,
  1158.   SA_PubSig,
  1159.   SA_PubTask,
  1160.   SA_DisplayID,
  1161.   SA_DClip,
  1162.   SA_Overscan,
  1163.   SA_Obsolete1,
  1164.   SA_ShowTitle,
  1165.   SA_Behind,
  1166.   SA_Quiet,
  1167.   SA_AutoScroll,
  1168.   SA_Pens,
  1169.   SA_FullPalette,
  1170.   SA_ColorMapEntries,
  1171.   SA_Parent,
  1172.   SA_Draggable,
  1173.   SA_Exclusive,
  1174.   SA_SharePens,
  1175.   SA_BackFill,
  1176.   SA_Interleaved,
  1177.   SA_Colors32,
  1178.   SA_VideoControl,
  1179.   SA_FrontChild,
  1180.   SA_BackChild,
  1181.   SA_LikeWorkbench,
  1182.   SA_Reserved,
  1183.   SA_MinimizeISG,
  1184.   0xffffffff,
  1185. };
  1186.  
  1187. UBYTE *TagStrings[]=
  1188. {
  1189.   "SA_Left            %ld",
  1190.   "SA_Top             %ld",
  1191.   "SA_Width           %ld",
  1192.   "SA_Height          %ld",
  1193.   "SA_Depth           %ld",
  1194.   "SA_DetailPen       %ld",
  1195.   "SA_BlockPen        %ld",
  1196.   "SA_Title           %s",
  1197.   "SA_Colors          %lx",
  1198.   "SA_ErrorCode       %lx",
  1199.   "SA_Font            %lx",
  1200.   "SA_SysFont         %ld",
  1201.   "SA_Type            %lx",
  1202.   "SA_BitMap          %lx",
  1203.   "SA_PubName         %s",
  1204.   "SA_PubSig          %lx",
  1205.   "SA_PubTask         %lx",
  1206.   "SA_DisplayID       %lx",
  1207.   "SA_DClip           %lx",
  1208.   "SA_Overscan        %ld",
  1209.   "SA_Obsolete1       %ld",
  1210.   "SA_ShowTitle       %ld",
  1211.   "SA_Behind          %ld",
  1212.   "SA_Quiet           %ld",
  1213.   "SA_AutoScroll      %ld",
  1214.   "SA_Pens            %lx",
  1215.   "SA_FullPalette     %ld",
  1216.   "SA_ColorMapEntries %ld",
  1217.   "SA_Parent          %lx",
  1218.   "SA_Draggable       %ld",
  1219.   "SA_Exclusive       %ld",
  1220.   "SA_SharePens       %ld",
  1221.   "SA_BackFill        %lx",
  1222.   "SA_Interleaved     %ld",
  1223.   "SA_Colors32        %lx",
  1224.   "SA_VideoControl    %lx",
  1225.   "SA_FrontChild      %lx",
  1226.   "SA_BackChild       %lx",
  1227.   "SA_LikeWorkbench   %ld",
  1228.   "SA_Reserved        %ld",
  1229.   "SA_MinimizeISG     %ld",
  1230.   "Unknown Tag        %ld"
  1231. };
  1232.  
  1233. UBYTE *FindTagSting(ULONG id)
  1234. {
  1235.   ULONG l;
  1236.   
  1237.   for(l=0;;l++)
  1238.   {
  1239.     if(TagID[l]==id || TagID[l]==0xffffffff)
  1240.       return(TagStrings[l]);
  1241.   }
  1242.   return(TagStrings[l]);
  1243. }
  1244.  
  1245. void PrintDefNode(struct DefaultNode *DN)
  1246. {
  1247.   kprintf("DefaultNode(%8lx)\n Def_Node.ln_Name: %s\n",DN,DN->Def_Node.ln_Name);
  1248.   kprintf(" Type: %ld\n ModeSelect: %ld\n ModeID: %8lx\n Width: %ld Height: %ld\n"
  1249.          " OverscanType:%ld\n AutoScroll: %ld\n Look3D: %ld\n Flags: %8lx\n "
  1250.          "OrigDisplayID: %8lx\n",
  1251.          DN->Type,DN->ModeSelect,DN->ModeID,DN->Width,DN->Height,DN->OverscanType,
  1252.          DN->AutoScroll,DN->Look3D,DN->Flags,
  1253.          DN->OrigDisplayID);
  1254. }
  1255. #endif
  1256.  
  1257.  
  1258. void CloneTextAttr(struct TTextAttr *Source, struct TTextAttr *Dest)
  1259. {
  1260.   CopyMem(Source,Dest,sizeof(struct TextAttr));
  1261.     
  1262.   if(Dest->tta_Name=AllocVec(strlen(Source->tta_Name)+1,MEMF_CLEAR|MEMF_PUBLIC))
  1263.   {
  1264.     strcpy(Dest->tta_Name,Source->tta_Name);
  1265.     if(Dest->tta_Style & FSF_TAGGED)
  1266.     {
  1267.       if(!(Dest->tta_Tags=CloneTagItems(Source->tta_Tags)))
  1268.         Dest->tta_Style &= (~FSF_TAGGED);
  1269.     }
  1270.   }
  1271.   else
  1272.   {
  1273.     Dest->tta_Name=Topaz;
  1274.     Dest->tta_YSize=8;
  1275.     Dest->tta_Style=0;
  1276.     Dest->tta_Flags=0;
  1277.   }
  1278. }
  1279.  
  1280.  
  1281.